package raft.core;

/**
 * Raft节点状态枚举
 * 
 * <p>Raft算法中每个节点在任何时候都处于以下三种状态之一：</p>
 * <ul>
 *   <li><b>FOLLOWER (跟随者)</b>: 被动接收来自Leader和Candidate的RPC请求</li>
 *   <li><b>CANDIDATE (候选者)</b>: 主动发起选举，试图成为Leader</li>
 *   <li><b>LEADER (领导者)</b>: 处理所有客户端请求，向Follower复制日志</li>
 * </ul>
 * 
 * <p><b>状态转换规则：</b></p>
 * <pre>
 * FOLLOWER → CANDIDATE: 选举超时且未收到Leader心跳
 * CANDIDATE → LEADER: 获得多数票
 * CANDIDATE → FOLLOWER: 收到更高任期的消息 或 发现新的有效Leader
 * LEADER → FOLLOWER: 发现更高任期的节点
 * </pre>
 * 
 * @author Raft Implementation Team
 * @version 1.0
 * @since 1.0
 */
public enum RaftState {
    
    /**
     * 跟随者状态
     * <p>节点启动时的初始状态，被动响应Leader的AppendEntries和Candidate的RequestVote请求。
     * 如果选举超时期间未收到Leader心跳，则转换为Candidate状态。</p>
     */
    FOLLOWER,
    
    /**
     * 候选者状态  
     * <p>当Follower选举超时后进入此状态，会增加任期号并向其他节点发送投票请求。
     * 如果获得多数票则成为Leader，否则重新选举或回到Follower状态。</p>
     */
    CANDIDATE,
    
    /**
     * 领导者状态
     * <p>负责处理客户端请求，向Follower发送心跳和日志复制请求。
     * 任期内只能有一个Leader，如果发现更高任期则立即回到Follower状态。</p>
     */
    LEADER
} 